package com.empire.module.member.service.warningindividual;

import com.baomidou.mybatisplus.extension.service.IService;
import com.empire.module.member.controller.admin.warningindividual.vo.*;
import com.empire.module.member.dal.dataobject.transportationrecord.TransportationRecordDO;
import com.empire.module.member.dal.dataobject.warningindividual.PersonWarningCountDTO;
import com.empire.module.member.dal.dataobject.warningindividual.UnifiedWarningDTO;
import com.empire.module.member.dal.dataobject.warningindividual.WarningIndividualDO;
import com.empire.framework.common.pojo.PageResult;
import com.empire.module.member.dal.dataobject.warningindividual.WarningTypeCountDTO;

import javax.validation.Valid;
import java.util.List;

/**
 * 非聚集预警记录表（1条记录对应1个人的1次预警） Service 接口
 *
 * @author 主席大人
 */
public interface WarningIndividualService extends IService<WarningIndividualDO> {

    /**
     * 创建非聚集预警记录表（1条记录对应1个人的1次预警）
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createWarningIndividual(@Valid WarningIndividualSaveReqVO createReqVO);

    /**
     * 交通记录预警
     *
     * @param transportationRecord 交通记录
     * @return 预警Id
     */
    Long createTrasportWarningIndividual(TransportationRecordDO transportationRecord);

    /**
     * 更新非聚集预警记录表（1条记录对应1个人的1次预警）
     *
     * @param updateReqVO 更新信息
     */
    void updateWarningIndividual(@Valid WarningIndividualSaveReqVO updateReqVO);

    /**
     * 删除非聚集预警记录表（1条记录对应1个人的1次预警）
     *
     * @param id 编号
     */
    void deleteWarningIndividual(Long id);

    /**
     * 获得非聚集预警记录表（1条记录对应1个人的1次预警）
     *
     * @param id 编号
     * @return 非聚集预警记录表（1条记录对应1个人的1次预警）
     */
    WarningIndividualDO getWarningIndividual(Long id);

    /**
     * 获得非聚集预警记录表（1条记录对应1个人的1次预警）分页
     *
     * @param pageReqVO 分页查询
     * @return 非聚集预警记录表（1条记录对应1个人的1次预警）分页
     */
    PageResult<WarningIndividualDO> getWarningIndividualPage(WarningIndividualPageReqVO pageReqVO);

    /**
     * 查询人员列表人员总数
     *
     * @param personIdList 人员ID列表
     * @return 统计列表
     */
    List<PersonWarningCountDTO> countPersonWarnings(List<Integer> personIdList);

    /**
     * 单条标记已读
     * @param id 聚集人员记录ID
     */
    void markSingleRead(Long id);

    /**
     * 批量标记已读
     * @param ids 聚集人员记录ID列表
     */
    void markBatchRead(List<Long> ids);

    /**
     * 获得案件最新预警列表
     * @param pageVO 案件分页参数
     * @return 案件最新预警列表
     */
    PageResult<UnifiedWarningDTO> getCaseLatestWarnPage(LatestWarnPageReqVO pageVO);

    /**
     * 获得首页最新预警列表
     * @param pageVO 案件分页参数
     * @return 案件最新预警列表
     */
    PageResult<UnifiedWarningDTO> getHomeLatestWarnPage(LatestWarnPageReqVO pageVO);

    /**
     * 获得个人最新预警列表
     * @param pageVO 分页参数
     * @return 最新预警列表
     */
    PageResult<UnifiedWarningDTO> getPersonLatestWarnPage(LatestWarnPageReqVO pageVO);

    /**
     * 预览报告最新预警列表
     * @param presentationId 报告Id
     * @return 预警列表
     */
    PageResult<UnifiedWarningDTO> presentationLatestWarnPage(Long presentationId);

    // 新增：获取今日预警类型统计
    List<WarningTypeCountDTO> countTodayWarningsByType(String caseId);

    List<WarningTypeCountDTO> countHomeTodayWarningsByType();

}